//用户认证模块实现
#include "../inc/user_auth.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 全局变量定义
char g_logged_in_username[32] = "";

/**
 * @brief 从文件中加载用户数据到内存
 * @param users 存储用户数据的数组
 * @param max_users 数组的最大容量
 * @return 实际加载的用户数量，-1表示文件读取失败
 */
int load_users(User users[], int max_users) {
    FILE *file = fopen(USERS_FILE_PATH, "r");
    if (file == NULL) {
        printf("用户文件 %s 不存在，将在追加时创建新文件。\n", USERS_FILE_PATH);
        fflush(stdout);
        return 0;
    }

    char line[128]; // 假设一行最长128字符
    int count = 0;

    printf("正在从文件加载用户...\n");
    fflush(stdout);
    while (fgets(line, sizeof(line), file) != NULL && count < max_users) {
        line[strcspn(line, "\n")] = 0; // 移除换行符

        char *username_str = strtok(line, ",");
        char *password_str = strtok(NULL, ",");

        if (username_str != NULL && password_str != NULL) {
            strncpy(users[count].username, username_str, sizeof(users[count].username) - 1);
            users[count].username[sizeof(users[count].username) - 1] = '\0';

            strncpy(users[count].password, password_str, sizeof(users[count].password) - 1);
            users[count].password[sizeof(users[count].password) - 1] = '\0';
            count++;
        }
    }

    fclose(file);
    printf("已加载 %d 个用户。\n", count);
    fflush(stdout);
    return count;
}

/**
 * @brief 将新用户追加到用户数据文件
 * @param user 要追加的用户结构体指针
 * @return 0成功，-1失败
 */
int append_user(const User *user) {
    FILE *file = fopen(USERS_FILE_PATH, "a+"); // "a+" 模式：如果文件不存在则创建，如果存在则在末尾追加
    if (file == NULL) {
        printf("错误：无法打开用户文件 %s 进行写入。\n", USERS_FILE_PATH);
        fflush(stdout);
        return -1;
    }

    fprintf(file, "%s,%s\n", user->username, user->password);
    fclose(file);
    printf("已追加用户：%s\n", user->username);
    fflush(stdout);
    return 0;
}

/**
 * @brief 检查用户名是否已存在
 * @param username 要检查的用户名
 * @param users 存储用户数据的数组
 * @param num_users 数组中当前的用户数量
 * @return 1如果用户名存在，0如果不存在
 */
int is_username_exists(const char *username, const User users[], int num_users) {
    for (int i = 0; i < num_users; i++) {
        if (strcmp(username, users[i].username) == 0) {
            printf("用户名 '%s' 已存在。\n", username);
            fflush(stdout);
            return 1; // 用户名已存在
        }
    }
    printf("用户名 '%s' 不存在。\n", username);
    fflush(stdout);
    return 0; // 用户名不存在
}

/**
 * @brief 验证用户凭据
 * @param username 用户名
 * @param password 密码
 * @param users 存储用户数据的数组
 * @param num_users 数组中当前的用户数量
 * @return 1如果凭据匹配，0如果匹配失败
 */
int verify_credentials(const char *username, const char *password, const User users[], int num_users) {
    for (int i = 0; i < num_users; i++) {
        if (strcmp(username, users[i].username) == 0 && strcmp(password, users[i].password) == 0) {
            printf("用户 '%s' 的凭据已验证。\n", username);
            fflush(stdout);
            return 1; // 凭据匹配
        }
    }
    printf("用户 '%s' 的凭据验证失败。\n", username);
    fflush(stdout);
    return 0;
}
